package com.liuhouse.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.liuhouse.constants.SystemCanstants;
import com.liuhouse.domain.LoginUser;
import com.liuhouse.mapper.MenuMapper;
import com.liuhouse.mapper.UserMapper;
import com.liuhouse.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

//当liuhouse-blog的BlogLoginServiceImpl类封装好登录的用户名和密码之后,就会传到当前这个类,当然是内部实现的
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    //UserMapper是我们在liuhouse-framework工程mapper目录的接口
    private UserMapper userMapper;

    @Autowired
    private MenuMapper menuMapper;

    @Override
    //在这里之前,我们已经拿到了登录的用户名和密码,UserDetails是SpringSecurity官方提供的接口
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根据拿到的用户名,并结合查询条件(数据库是否有这个用户名),去查询用户信息
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUserName , username);
        User user = userMapper.selectOne(queryWrapper);
        //判断是否查询到用户，也就是这个用户是否存在,如果没有查询到就抛出异常
        if(Objects.isNull(user)){
            throw new RuntimeException("用户名不存在");//后期会对异常进行统一处理
        }
        //TODO 查询权限信息， 并封装
        //如果是后台用户,才需要查询权限,也就是只会针对后台用户做权限效验
        //虽然把这些东西学完  不能说是完全掌握 但是做东西 做项目肯定没有问题 而且 以后还会参考
        //随着写的越多 我就会越熟练
        if(user.getType().equals(SystemCanstants.IS_ADMIN)){
            //根据用户id查询权限关键字,即是list是权限信息的集合
            List<String> list = menuMapper.selectPermsByOtherUserId(user.getId());
            return new LoginUser(user , list);
        }
        //返回查询到的用户信息,注意下面哪行直接返回user报错,我们需要在liuhouse-framework工程的domain目录
        //新建LoginUser类，在loginUser类实现UserDetails接口,然后下面那刚就返回LoginUser对象
        return new LoginUser(user , null);
    }
}
